/*
 * 文件名称:          DataPage.java
 * 版权所有@ 2016——2017 无锡聆音科技有限公司，保留所有权利
 * 时间:             2016年7月27日 下午9:21:11
 */

package com.lingyin.database.transaction.domain;

import java.io.Serializable;
import java.util.List;


/**
 *  数据分页记录对象
 * 
 * @项目        hibernate.database.transaction
 * 
 * @作者:       关宏新
 * 
 * @日期:       2016年7月27日
 * 
 * @负责人:    关宏新
 * 
 * @负责小组:   聆音项目组
 * 
 */
public class DataPage<T> implements Serializable
{
    private static final long serialVersionUID = 7386201149818309936L;
    /**
     * 每页显示记录数。
     * 该值小于等于0表示不分页
     */
    private int pageSize;
    /**
     * 当前页码，如果分页，则该值从数字1开始。
     * 该值小于等于1表示当前页为第一页
     */
    private int currentPage;
    /**
     * 数据总记录数
     * 如果不分页，则该值小于等于0
     */
    private long totalRecords;

    /**
     * 分页实际展示数据
     */
    private List<T> datas;

    /**
     * 默认构造
     */
    public DataPage()
    {

    }

    /**
     * 构造分页对象
     * @param pageSize 需要分页时候，每页的数量
     * @param current 当前页
     */
    public DataPage(int pageSize, int current)
    {
        this.pageSize = pageSize;
        this.currentPage = current;
    }

    /**
     * @return 获取每页最大记录数，该值小于等于0表示不分页
     */
    public int getPageSize()
    {
        return pageSize;
    }

    /**
     * 设置每页最大记录数，该值小于等于0表示不分页
     * 外界在使用该对象进行分页查询的时候，如果需要分页，该值必须设置。
     * @param pageSize 每页最大记录数
     */
    public void setPageSize(int pageSize)
    {
        this.pageSize = pageSize;
    }

    /**
     * 页面开始值从1开始，也就是第一页该值为1，如果该值小于等于0，也表示当前页为第一页。
     * @return 返回当前页
     */
    public int getCurrentPage()
    {
        return currentPage;
    }

    /**
     * 设置当前需要查询的页
     * 页面开始值从1开始，也就是第一页该值为1，如果该值小于等于0，也表示当前页为第一页。
     * @param currentPage  需要查询的当前页码
     */
    public void setCurrentPage(int currentPage)
    {
        this.currentPage = currentPage;
    }

    /**
     * @return 返回总记录数
     */
    public long getTotalRecords()
    {
        return totalRecords;
    }

    /**
     * 设置总记录数
     *
     * @param totalRecords 总记录数
     */
    public void setTotalRecords(long totalRecords)
    {
        this.totalRecords = totalRecords;
    }

    /**
     * @return 获取记录的总页数，如果该值小于0，则表示没有分页。
     */
    public long getPageTotal()
    {
        if (pageSize > 0) // 需要分页，通过总记录数和每页数计算总的页面数量
        {
            return (totalRecords + pageSize - 1) / pageSize;
        }
        return -1;
    }

    /**
     * @return 
     */
    public boolean isPrevPage()
    {
        return currentPage > 1;
    }

    /**
     * @return 
     */
    public boolean isNextPage()
    {
        return currentPage < getPageTotal();
    }

    /**
     * @return 返回分页的数据集合，如果没有分页，则返回所有数据集合
     */
    public List<T> getDatas()
    {
        return datas;
    }

    /**
     * 设置 数据集合
     *
     * @param datas 数据集合
     */
    public void setDatas(List<T> datas)
    {
        this.datas = datas;
    }

    /**
     * 比较目标对象是否相等
     * @param o 目标对象
     * @return 对象是否相等
     */
    public boolean equals(Object o)
    {
        if (this == o)
        {
            return true;
        }
        if (!(o instanceof DataPage))
        {
            return false;
        }

        DataPage< ? > that = (DataPage< ? >)o;
        if (currentPage != that.currentPage)
        {
            return false;
        }
        if (pageSize != that.pageSize)
        {
            return false;
        }
        if (getPageTotal() != that.getPageTotal())
        {
            return false;
        }
        if (totalRecords != that.totalRecords)
        {
            return false;
        }
        if (datas != null ? !datas.equals(that.datas) : that.datas != null)
        {
            return false;
        }

        return true;
    }

    /**
     * @return 对象哈希值
     */
    public int hashCode()
    {
        int result = pageSize;
        result = 31 * result + currentPage;
        result = 31 * result + new Long(totalRecords).intValue();
        result = 31 * result + new Long(getPageTotal()).intValue();
        result = 31 * result + (datas != null ? datas.hashCode() : 0);
        return result;
    }

}
